/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-23 下午9:57 Created by dwzhang
 */
package com.jade.framework.base.criterion.sql;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

/**
 * SQL解析上下文，用于生成组装的SQL语句以及记录参数列表.
 *
 * @author dwzhang
 * @version 1.0 13-4-23 下午9:57
 */
public class SqlContext
{
    /** 上下文语句 */
    protected StringBuilder sb = new StringBuilder();
    /** 上下文参数 */
    protected List<Object> preparedValues = new ArrayList<Object>();

    /** Constructor. */
    public SqlContext()
    {
    }

    /**
     * Constructor.
     * <p/>
     * sql为普通语句，要求为一完整的语句，如：
     * select contact from ContactInfo contact
     * select contact from ContactInfo contact WHERE contact.id=1
     * 以下语句不合法：
     * select contact from ContactInfo contact WHERE
     * select contact from ContactInfo contact WHERE contact.id=1 and
     *
     * @param sql sql语句
     */
    public SqlContext(String sql)
    {
        if (StringUtils.isBlank(sql)) {
            throw new IllegalArgumentException("Invalid sql:" + sql);
        }
        sb.append(sql);
    }

    /**
     * 添加上下文语句.
     *
     * @param obj 上下文语句
     */
    public void append(Object obj)
    {
        sb.append(obj);
    }

    /**
     * 获取上下文语句.
     *
     * @return 上下文语句
     */
    public String getContextString()
    {
        return sb.toString();
    }

    protected StringBuilder getNativeString()
    {
        return sb;
    }

    /**
     * 添加上下文参数.
     *
     * @param obj 上下文参数
     */
    public void addPrepraredValue(Object obj)
    {
        preparedValues.add(obj);
    }

    /**
     * 获取上下文参数.
     *
     * @return 上下文参数
     */
    public List getPreparedValues()
    {
        return preparedValues;
    }
}
